#define FALSE	0
#define TRUE	1

// 临界区代码段
extern void critical_region();
// 非临界区的代码段
extern void noncritical_region();

int turn;					// 记录当前“轮到”哪个进程进入临界区
int interested[2];			// 记录每个进程是否愿意进入临界区

void enter_region(int process) {
	int other = 1 - process;			// 进程编号就是0 或 1

	interested[process] = TRUE;			// 标记本进程希望进入临界区
	turn = other;						// 尝试将turn设置为另一个进程的编号

	// 等待条件：检查对方是否也想使用，且最后一次是谦让的
	// 一种情况是 1进程不需要进入 不用等待
	// 另一种是   1进程需要进入并且在执行到改变interested的时候时间片截止(导致两边都堵死)
	// 0进程继续等待 直到1进程执行到turn和other不一样(turn是全局变量)
	while (interested[other] == TRUE && turn == other);
}

void leave_region(int process) {
	// 标记本进程已离开临界区
	interested[process] = FALSE;
}

void process0() {
	do {
		enter_region(0);
		critical_region();
		leave_region(0);
		noncritical_region();
	}while (TRUE);
}

void process1() {
	do {
		enter_region(1);
		critical_region();
		leave_region(1);
		noncritical_region();
	}while (TRUE);
}
